#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/thread_info.h>
#include <linux/unistd.h>

// 模块初始化函数
static int __init stack_info_module_init(void)
{
    struct task_struct *task = current;    // 获取当前任务的 task_struct
    unsigned long user_stack_start;        // 存储用户栈的起始地址
    unsigned long kernel_stack_start;      // 存储内核栈的起始地址

    // 获取用户栈的起始地址
    if (task->mm) {                        // 如果任务有 mm 结构，表示用户态进程
        user_stack_start = (unsigned long)task->mm->start_stack; // 通过 mm 结构获取用户栈起始地址
        pr_info("User stack start address: 0x%lx\n", user_stack_start); 
    } else {
        pr_info("User stack not available (no mm struct)\n");    // 如果任务没有 mm 结构，表示没有用户栈
    }

    // 获取内核栈的起始地址
    kernel_stack_start = (unsigned long)task->stack; // 通过 task_struct 的 stack 字段获取内核栈起始地址
    pr_info("Kernel stack start address: 0x%lx\n", kernel_stack_start); 

    return 0; 
}

static void __exit stack_info_module_exit(void)
{
    pr_info("Exiting stack info module...\n"); 
}

module_init(stack_info_module_init);
module_exit(stack_info_module_exit);

MODULE_LICENSE("GPL");            // 设置模块许可证为 GPL
